Universo Online
Web Sites Pessoais
Anterior Próximo Índice

Criando e Ligando um Programa .EXE

Um programa .EXE é um programa que o DOS pode realocar na memória depois da carga. O que isso quer dizer? Quer dizer que todas as referências a endereços serão modificadas conforme o segmento de carga inicial. Essa modificação é possível porque o programa .EXE tem um cabeçalho com várias informações sobre o programa, entre elas um ponteiro para uma tabela de ítens relocáveis dentro do programa e um inteiro dizendo quandos ítens recoláveis o arquivo tem. Um programa .EXE exige sempre um SEGMENTO DE PILHA, e nesse segmento devem ser reservados os bytes suficientes para a pilha do programa. Você deve, também, inicializar o segmento de dados (DS), o segmento de pilha (SS) e o ponteiro de pilha (SP), sendo este último um rótulo colocado após os bytes reservados à pilha.

;arquivo: progexe.asm
;para criar o arquivo-objeto: nasm -fobj progexe.asm
;para criar progexe.exe:
;1) com Tlink digite:  tlink progexe;
;2) com Alink digite: alink progexe -oEXE


segment CODIGO class=CODE

..start:
        mov ax, SEGDADOS 
        mov ds,ax  
        mov ax, SEGPILHA
        mov ss,ax
        mov sp, PONTPILHA

        mov dx, MENSAGEM
        mov ah,9
        int 0x21

        mov ax, 0x4C00
        int 0x21

segment SEGDADOS

    MENSAGEM "Esse é um Programa .EXE", '$'

segment SEGPILHA STACK class=STACK align=16
      resb 0x100
      PONTPILHA:

O código acima usa mov ax, SEGDADOS, e depois mov ds, ax porque não é permitido mover dados imediatamente para um registrador de segmento. O código mov dx, MENSAGEM move o endereço inicial do string MENSAGEM para o registrador DX, porque vamos chamar o serviço 9 da interrupção 0x21 do DOS para exibir o string na tela. No segmento de dados é declarado o string, que termina com o caracter '$', que sinaliza o fim do string para a rotina do DOS. Após imprimir o string, chamamos o serviço 0x4C, mais o código de erro 0x00, da interrupção 0x21 do DOS para encerrar o programa .EXE. No segmento de pilha definimos uma pilha de 256 bytes (0x100) e um rótulo indicando a altura da pilha (PONTPILHA). Essa pilha tem alguns atributos especiais: a sua classe chama-se STACK e ela é alinhada em parágrafo (align=16). O linker agrupa todos os segmentos de uma mesma classe, assim, se houver outros segmentos da classe STACK eles serão agrupados dentro dessa classe de segmento . A palavra STACK após o nome do segmento (SEGPILHA) é exigida pelos linkers compatívesl com o código objeto da microsoft (LINK, TLINK etc...).
Anterior Próximo Índice